home *** CD-ROM | disk | FTP | other *** search
/ Visual Basic Toolbox / Visual Basic Toolbox (P.I.E.)(1996).ISO / buttons / sprspin / sprspin.bas < prev    next >
BASIC Source File  |  1995-06-26  |  15KB  |  479 lines

  1. ' SuperSpin 1.000002
  2. ' Copyright 1995 Insert Information Technoloy
  3. '                Bastenakenstraat 110
  4. '                1066 JE  Amsterdam
  5. '                The Netherlands
  6. '                100101,131@Compuserve.com
  7. '
  8. ' Revision history
  9. ' 10 - 4 - 1995, version 1.000001 : Initial Release
  10. ' 26 - 4 - 1995, version 1.000002 : Sub UnloadSpin() added
  11. '
  12. Option Explicit
  13. Option Base 1
  14. Type SpinInfo
  15.     Step As Variant
  16.     Min As Variant
  17.     Max As Variant
  18.     Type As String ' Number, Date, Time
  19.     FormatString As String
  20.     StepChange As Integer ' allow step change with right button
  21.     ValueList As String ' comma separated string of allowed values
  22. End Type
  23.     
  24. Dim SpinProps() As SpinInfo
  25. Dim iNrOfSpins As Integer
  26. Dim SpinCntrl() As Control
  27. Dim SetCntrl() As Control
  28. Dim iButton As Integer
  29. Dim sPlusMin As String ' + or -
  30. Dim iShift As Integer ' button shift
  31. Dim iCurrentSpin As Integer
  32. Const LEFT_BUTTON = 1
  33. Const RIGHT_BUTTON = 2
  34.  
  35. Private Function pfunCountChar (InputString As Variant, Char As String) As Integer
  36.     ' This function returns the number of occurences of
  37.     ' character Char in string InputString
  38.     '
  39.     Dim i As Integer
  40.     Dim iStart As Integer
  41.     Dim iCounter As Integer
  42.     iStart = 1
  43.     '
  44.     For i = 1 To Len(InputString)
  45.         If Mid(InputString, i, 1) = Char Then
  46.             iCounter = iCounter + 1
  47.         End If
  48.     Next
  49.     '
  50.     pfunCountChar = iCounter
  51.     '
  52. End Function
  53.  
  54. Private Function pfunGetSpinNr (SpinCtl As Control) As Integer
  55.     Dim i As Integer
  56.     For i = 1 To iNrOfSpins
  57.         If SpinProps(i).Type <> "" Then ' skip the free entries
  58.             If SpinCntrl(i) = SpinCtl Then
  59.                 pfunGetSpinNr = i
  60.                 Exit Function
  61.             End If
  62.         End If
  63.     Next i
  64.     pfunGetSpinNr = 0
  65. End Function
  66.  
  67. Private Function pfunPiece (vPieceString, vSeparator, vPieceNumber)
  68.     ' Returns the desired piece from separated string
  69.     If Len(vPieceString) = 0 Then
  70.         pfunPiece = ""
  71.         Exit Function
  72.     End If
  73.     Dim iCurrentPiece As Integer
  74.     Dim iCurrentPos As Integer ' position within Piecestring
  75.     Dim iStartPos As Integer ' Start extract
  76.     Dim iEndPos As Integer   ' End extract
  77.     Dim bGotcha As Integer
  78.     iCurrentPos = 0
  79.     iCurrentPiece = 1
  80.     iStartPos = 1
  81.     Do While bGotcha = False
  82.         If iCurrentPiece = vPieceNumber Then
  83.             bGotcha = True
  84.             iStartPos = iCurrentPos + 1 ' without the delimiter
  85.             If iCurrentPiece = 1 Then
  86.                 iStartPos = 1
  87.             End If
  88.         End If
  89.         iCurrentPos = InStr(iCurrentPos + 1, vPieceString, vSeparator)
  90.         If iCurrentPos = 0 Then
  91.             iEndPos = Len(vPieceString)
  92.             Exit Do
  93.         End If
  94.         If bGotcha Then
  95.                iEndPos = iCurrentPos - 1 ' without the delimiter
  96.         End If
  97.         iCurrentPiece = iCurrentPiece + 1
  98.     Loop
  99.     
  100.     If bGotcha Then
  101.         pfunPiece = Mid(vPieceString, iStartPos, iEndPos - iStartPos + 1)
  102.     Else
  103.         pfunPiece = ""
  104.     End If
  105. End Function
  106.  
  107. Private Function pfunSpinGetListIndex (iSpinNr As Integer) As Integer
  108.     Dim sValue As String
  109.     sValue = SetCntrl(iSpinNr)
  110.     
  111.     If sValue = "" Then Exit Function
  112.     Dim iPieceNr As Integer
  113.     Dim sList As String
  114.     sList = SpinProps(iSpinNr).ValueList
  115.  
  116.     For iPieceNr = 1 To 999
  117.         If pfunPiece(sList, ",", iPieceNr) = sValue Then
  118.             pfunSpinGetListIndex = iPieceNr
  119.             Exit Function
  120.         ElseIf pfunPiece(sList, ",", iPieceNr) = "" Then
  121.             Exit Function
  122.         End If
  123.     Next iPieceNr
  124.     
  125. End Function
  126.  
  127. Private Function pfunSpinGetMax (SpinCtl As Control) As Variant
  128.     Dim iSpinNr As Integer
  129.     iSpinNr = pfunGetSpinNr(SpinCtl)
  130.     If SpinProps(iSpinNr).Max = "" Then
  131.         pfunSpinGetMax = ""
  132.         Exit Function
  133.     End If
  134.     Select Case SpinProps(iSpinNr).Type
  135.         Case "Number", "Days", "Months", "List"
  136.             pfunSpinGetMax = Val(SpinProps(iSpinNr).Max)
  137.         Case "Date"
  138.             pfunSpinGetMax = CVDate(SpinProps(iSpinNr).Max)
  139.         Case "Time"
  140.             pfunSpinGetMax = TimeValue(SpinProps(iSpinNr).Max)
  141.     End Select
  142. End Function
  143.  
  144. Private Function pfunSpinGetMin (SpinCtl As Control) As Variant
  145.     Dim iSpinNr As Integer
  146.     iSpinNr = pfunGetSpinNr(SpinCtl)
  147.     If SpinProps(iSpinNr).Min = "" Then
  148.         pfunSpinGetMin = ""
  149.         Exit Function
  150.     End If
  151.     Select Case SpinProps(iSpinNr).Type
  152.         Case "Number", "Days", "Months", "List"
  153.             pfunSpinGetMin = Val(SpinProps(iSpinNr).Min)
  154.         Case "Date"
  155.             pfunSpinGetMin = DateValue(SpinProps(iSpinNr).Min)
  156.         Case "Time"
  157.             pfunSpinGetMin = TimeValue(SpinProps(iSpinNr).Min)
  158.     End Select
  159.  
  160. End Function
  161.  
  162. Private Function pfunSpinGetValue (SpinCtl As Control) As Variant
  163.     Dim iSpinNr As Integer
  164.     Dim vVal As Variant
  165.     iSpinNr = pfunGetSpinNr(SpinCtl)
  166.     Select Case SpinProps(iSpinNr).Type
  167.         Case "Number"
  168.             vVal = SetCntrl(iSpinNr)
  169.             If SpinProps(iSpinNr).FormatString <> "" Then vVal = pfunUnFormatNumber(vVal)
  170.             pfunSpinGetValue = vVal
  171.         Case "Date"
  172.             vVal = SetCntrl(iSpinNr)
  173.             If SpinProps(iSpinNr).FormatString <> "" Then vVal = pfunUnformatDate(vVal)
  174.             pfunSpinGetValue = DateValue(vVal)
  175.         Case "Time"
  176.             pfunSpinGetValue = TimeValue(SetCntrl(iSpinNr))
  177.     End Select
  178. End Function
  179.  
  180. Private Function pfunUnformatDate (oldVal As Variant) As Variant
  181.     Dim sFormatString As String
  182.     sFormatString = SpinProps(iCurrentSpin).FormatString
  183.  
  184.     ' I'd figured that it only makes sense using the weekday
  185.     ' at the begin or the end of the FormatString separated by
  186.     ' a space
  187.     
  188.     If Left$(sFormatString, 3) = "ddd" Then
  189.         pfunUnformatDate = Right(oldVal, Len(oldVal) - InStr(oldVal, " ") + 1)
  190.     ElseIf Right$(sFormatString, 3) = "ddd" Then
  191.         pfunUnformatDate = pfunPiece(oldVal, " ", pfunCountChar(oldVal, " ") + 1)
  192.     Else
  193.         pfunUnformatDate = oldVal ' sigh,  dunno why I bothered in the first place
  194.         Exit Function
  195.     End If
  196.  
  197. End Function
  198.  
  199. Private Function pfunUnFormatNumber (oldVal As Variant)
  200.     Dim newVal As Variant
  201.     Dim i As Integer
  202.     Dim sChar As String
  203.     
  204.     For i = 1 To Len(oldVal)
  205.         sChar = Mid(oldVal, i, 1)
  206.         If InStr("0123456789,.-+", sChar) Then newVal = newVal & sChar
  207.     Next i
  208.     
  209.     pfunUnFormatNumber = newVal
  210.  
  211. End Function
  212.  
  213. Private Sub psubCalcNewVal (SpinCtl As Control)
  214.     ' Calculate new value
  215.     Dim vVal As Variant
  216.     Dim iSpinNr As Integer
  217.     iSpinNr = pfunGetSpinNr(SpinCtl)
  218.     vVal = pfunSpinGetValue(SpinCtl)
  219.     Select Case SpinProps(iSpinNr).Type
  220.         Case "Number"
  221.             Dim lStep As Long
  222.             lStep = Val(SpinProps(iSpinNr).Step)
  223.             If sPlusMin = "-" Then lStep = -lStep
  224.             vVal = vVal + lStep
  225.         Case "Date", "Time"
  226.             Dim sInterval As String
  227.             Dim iStep As Integer
  228.             sInterval = SpinProps(iSpinNr).Step
  229.             iStep = Val(sInterval)
  230.             sInterval = Mid$(sInterval, InStr(sInterval, ",") + 1, Len(sInterval))
  231.             If sPlusMin = "-" Then iStep = -iStep
  232.             vVal = DateAdd(sInterval, iStep, vVal)
  233.         Case "List"
  234.             vVal = pfunSpinGetListIndex(iSpinNr)
  235.             If sPlusMin = "+" Then
  236.                 vVal = vVal + 1
  237.             Else
  238.                 vVal = vVal - 1
  239.             End If
  240.         Case "Days", "Months"
  241.             vVal = pfunSpinGetListIndex(iSpinNr)
  242.             If sPlusMin = "+" Then
  243.                 vVal = vVal + 1
  244.             Else
  245.                 vVal = vVal - 1
  246.             End If
  247.     End Select
  248.     
  249.     If sPlusMin = "+" And (SpinProps(iSpinNr).Max <> "") Then
  250.         Dim vMax As Variant
  251.         vMax = pfunSpinGetMax(SpinCtl)
  252.         If vVal > vMax Then vVal = vMax
  253.     End If
  254.     
  255.     If sPlusMin = "-" And (SpinProps(iSpinNr).Min <> "") Then
  256.         Dim vMin As Variant
  257.         vMin = pfunSpinGetMin(SpinCtl)
  258.         If vVal < vMin Then vVal = vMin
  259.     End If
  260.  
  261.     Call SpinSetValue(iSpinNr, vVal)
  262. End Sub
  263.  
  264. Private Sub psubSpinInitDays (iSpinNr)
  265.     Dim i As Integer
  266.     Dim sDay As String
  267.     Dim sList As String
  268.     For i = 1 To 7
  269.         sDay = Format(CVDate(34608 + i), "dddd")
  270.         If i > 1 Then sList = sList & ","
  271.         sList = sList & sDay
  272.     Next i
  273.     SpinProps(iSpinNr).ValueList = sList
  274.     SpinProps(iSpinNr).Min = 1
  275.     SpinProps(iSpinNr).Max = 7
  276. End Sub
  277.  
  278. Private Sub psubSpinInitMonths (iSpinNr As Integer)
  279.     Dim i As Integer
  280.     Dim sMonth As String
  281.     Dim sList As String
  282.     For i = 1 To 12
  283.         sMonth = Format(CVDate("01/" & i & "/1995"), "mmmm")
  284.         If i > 1 Then sList = sList & ","
  285.         sList = sList & sMonth
  286.     Next i
  287.     SpinProps(iSpinNr).ValueList = sList
  288.     SpinProps(iSpinNr).Min = 1
  289.     SpinProps(iSpinNr).Max = 12
  290. End Sub
  291.  
  292. Function SpinCurrentSpin () As Integer
  293.     SpinCurrentSpin = iCurrentSpin
  294. End Function
  295.  
  296. Function SpinGetStep (iSpinNr) As String
  297.     SpinGetStep = SpinProps(iSpinNr).Step
  298. End Function
  299.  
  300. Function SpinGetType (iSpinNr) As String
  301.     SpinGetType = SpinProps(iSpinNr).Type
  302. End Function
  303.  
  304. Function SpinInit (SpinCtl As Control, SetCtl As Control, sType As String) As Integer
  305.     Dim iSpinNr As Integer
  306.     Dim i As Integer
  307.     
  308.     ' Search for a free Spin
  309.     iSpinNr = -1
  310.     For i = 1 To iNrOfSpins
  311.         If SpinProps(i).Type = "Free" Then
  312.             iSpinNr = i
  313.             Exit For
  314.         End If
  315.     Next i
  316.     
  317.     ' No free Spins : assign a new number
  318.     If iSpinNr = -1 Then
  319.         iNrOfSpins = iNrOfSpins + 1
  320.         iSpinNr = iNrOfSpins
  321.         ReDim Preserve SpinProps(iSpinNr)
  322.         ReDim Preserve SpinCntrl(iSpinNr)
  323.         ReDim Preserve SetCntrl(iSpinNr)
  324.     End If
  325.     
  326.     Debug.Print "Spin Number : " & iSpinNr
  327.  
  328.     Set SpinCntrl(iSpinNr) = SpinCtl
  329.     Set SetCntrl(iSpinNr) = SetCtl
  330.     
  331.     Select Case sType
  332.         Case "Number", "Date", "Time", "Days", "Months", "List"
  333.             SpinProps(iSpinNr).Type = sType
  334.         Case Else
  335.             SpinProps(iSpinNr).Type = "Number"
  336.     End Select
  337.     
  338.     If sType = "Days" Then Call psubSpinInitDays(iSpinNr)
  339.     If sType = "Months" Then Call psubSpinInitMonths(iSpinNr)
  340.     
  341.     SpinCtl.Picture = LoadPicture(App.Path & "\SPIN.BMP")
  342.     SpinInit = iSpinNr
  343.  
  344. End Function
  345.  
  346. Sub SpinMouseDown (SpinCtl As Control, Button As Integer, Shift As Integer, X As Single, Y As Single)
  347.     iButton = Button
  348.     iShift = Shift
  349.     iCurrentSpin = pfunGetSpinNr(SpinCtl)
  350.     If Y < (SpinCtl.Height \ 2) Then
  351.         sPlusMin = "+"
  352.         If Button = LEFT_BUTTON Then SpinCtl.Picture = LoadPicture(App.Path & "\SPINPD.BMP")
  353.     Else
  354.         sPlusMin = "-"
  355.         If Button = LEFT_BUTTON Then SpinCtl.Picture = LoadPicture(App.Path & "\SPINMD.BMP")
  356.     End If
  357. End Sub
  358.  
  359. Sub SpinMouseUp (SpinCtl As Control)
  360.     ' Restore buttons
  361.     If iButton = LEFT_BUTTON Then
  362.         SpinCtl.Picture = LoadPicture(App.Path & "\SPIN.BMP")
  363.         Call psubCalcNewVal(SpinCtl)
  364.         Exit Sub
  365.     Else
  366.         If iShift = 0 Then
  367.             Dim vVal As Variant ' could be anything
  368.             If sPlusMin = "+" Then
  369.                 vVal = pfunSpinGetMax(SpinCtl)
  370.             Else
  371.                 vVal = pfunSpinGetMin(SpinCtl)
  372.             End If
  373.             If vVal = "" Then Exit Sub ' none defined
  374.             Call SpinSetValue(iCurrentSpin, vVal)
  375.         Else ' Shift Right Button
  376.             Dim iSpinNr As Integer
  377.             iSpinNr = pfunGetSpinNr(SpinCtl)
  378.             If SpinProps(iSpinNr).StepChange = True Then frmSuperSpin.Show 1
  379.         End If
  380.     End If
  381. End Sub
  382.  
  383. Sub SpinSetFormat (iSpinNr As Integer, sFormatString As String)
  384.     SpinProps(iSpinNr).FormatString = sFormatString
  385. End Sub
  386.  
  387. Sub SpinSetList (iSpinNr As Integer, sList)
  388.     Dim iNrOfPieces As Integer
  389.     Dim iStartPos As Integer
  390.     iStartPos = 1
  391.     iNrOfPieces = 1
  392.     Do While InStr(iStartPos, sList, ",") > 0
  393.         iStartPos = InStr(iStartPos, sList, ",") + 1
  394.         iNrOfPieces = iNrOfPieces + 1
  395.     Loop
  396.     SpinProps(iSpinNr).ValueList = sList
  397.     SpinProps(iSpinNr).Min = 1
  398.     SpinProps(iSpinNr).Max = iNrOfPieces
  399. End Sub
  400.  
  401. Sub SpinSetMax (iSpinNr As Integer, vMax As Variant)
  402.     SpinProps(iSpinNr).Max = vMax
  403. End Sub
  404.  
  405. Sub SpinSetMin (iSpinNr As Integer, vMin As Variant)
  406.     SpinProps(iSpinNr).Min = vMin
  407. End Sub
  408.  
  409. Sub SpinSetStep (iSpinNr As Integer, vStep As Variant)
  410.     Dim sType As String
  411.     sType = SpinGetType(iSpinNr)
  412.     Select Case sType
  413.         Case "Number"
  414.             SpinProps(iSpinNr).Step = vStep
  415.         Case "Date", "Time"
  416.             If InStr(vStep, ",") Then
  417.                 SpinProps(iSpinNr).Step = vStep
  418.             Else
  419.                 If sType = "Date" Then
  420.                     SpinProps(iSpinNr).Step = Val(vStep) & ",d" ' days
  421.                 Else
  422.                     SpinProps(iSpinNr).Step = Val(vStep) & ",n" ' minutes
  423.                 End If
  424.             End If
  425.     End Select
  426. End Sub
  427.  
  428. Sub SpinSetStepChange (iSpinNr, bVal As Integer)
  429.     SpinProps(iSpinNr).StepChange = bVal
  430. End Sub
  431.  
  432. Sub SpinSetValue (iSpinNr As Integer, vVal As Variant)
  433.     Select Case SpinProps(iSpinNr).Type
  434.         Case "Number"
  435.             If SpinProps(iSpinNr).FormatString <> "" Then
  436.                 SetCntrl(iSpinNr) = Format(vVal, SpinProps(iSpinNr).FormatString)
  437.             Else
  438.                 SetCntrl(iSpinNr) = Val(vVal)
  439.             End If
  440.         Case "Date"
  441.             If SpinProps(iSpinNr).FormatString <> "" Then
  442.                 SetCntrl(iSpinNr) = Format(vVal, SpinProps(iSpinNr).FormatString)
  443.             Else
  444.                 SetCntrl(iSpinNr) = Format(vVal, "Short Date")
  445.             End If
  446.         Case "Time"
  447.             If SpinProps(iSpinNr).FormatString <> "" Then
  448.                 SetCntrl(iSpinNr) = Format(vVal, SpinProps(iSpinNr).FormatString)
  449.             Else
  450.                 SetCntrl(iSpinNr) = Format(vVal, "hh:mm")
  451.             End If
  452.         Case "Days"
  453.             SetCntrl(iSpinNr) = Format(CVDate(34608 + vVal), "dddd")
  454.         Case "Months"
  455.             SetCntrl(iSpinNr) = Format(CVDate("01/" & vVal & "/1995"), "mmmm")
  456.         Case "List"
  457.             SetCntrl(iSpinNr) = pfunPiece(SpinProps(iSpinNr).ValueList, ",", vVal)
  458.     End Select
  459. End Sub
  460.  
  461. Sub SpinUnload (SpinCtl As Control)
  462.     ' Free Resources
  463.     ' Clear Array entries
  464.     '
  465.     Dim iSpinNr As Integer
  466.     iSpinNr = pfunGetSpinNr(SpinCtl)
  467.     If iSpinNr = -1 Then Exit Sub
  468.     Set SpinCntrl(iSpinNr) = Nothing
  469.     Set SetCntrl(iSpinNr) = Nothing
  470.     SpinProps(iSpinNr).Type = ""
  471.     SpinProps(iSpinNr).Max = Null
  472.     SpinProps(iSpinNr).Min = Null
  473.     SpinProps(iSpinNr).Step = Null
  474.     SpinProps(iSpinNr).ValueList = ""
  475.     SpinProps(iSpinNr).FormatString = ""
  476.  
  477. End Sub
  478.  
  479.